///\file camera.hpp
///\brief contient la description de la classe Camera
///\author Allan BLANCHARD
#ifndef _CAMERA
#define _CAMERA

#include <GL/gl.h>

///\class Camera
///\brief définit les paramètres d'une caméra et ses méthodes de placement
class Camera{
private :
  float eye  [3]; ///< position de l'oeil
  float focus[3]; ///< position du point regardé
  float hdir [3]; ///< direction du "haut"

public :
  ///\brief Constructeur
  ///Construit une camera
  ///\param ex : position de l'oeil sur x
  ///\param ey : position de l'oeil sur y
  ///\param ez : position de l'oeil sur z
  ///\param fx : position du point regardé sur x
  ///\param fy : position du point regardé sur y
  ///\param fz : position du point regardé sur z
  ///\param hx : direction sur x du vecteur indiquant le "haut" de la scène
  ///\param hy : direction sur y du vecteur indiquant le "haut" de la scène
  ///\param hz : direction sur z du vecteur indiquant le "haut" de la scène
  Camera(float ex, float ey, float ez, 
	 float fx, float fy, float fz, 
	 float hx, float hy, float hz){
    eye[0] = ex;
    eye[1] = ey;
    eye[2] = ez;

    focus[0] = fx;
    focus[1] = fy;
    focus[2] = fz;
    
    hdir[0] = hx;
    hdir[1] = hy;
    hdir[2] = hz;
  }

  ///\brief Constructeur
  ///place tout sur 0,0,0
  Camera(){
    eye[0] = 0;
    eye[1] = 0;
    eye[2] = 0;

    focus[0] = 0;
    focus[1] = 0;
    focus[2] = 0;
    
    hdir[0] = 0;
    hdir[1] = 0;
    hdir[2] = 0;
  }

  ///\brief
  ///déplace l'oeil
  ///\param x position de l'oeil sur x
  ///\param y position de l'oeil sur y
  ///\param z position de l'oeil sur z
  inline void seteyepos(float x, float y, float z){
    eye[0] = x;
    eye[1] = y;
    eye[2] = z;
  }

  ///\brief
  ///déplace le point regardé
  ///\param x position du point regardé sur x
  ///\param y position du point regardé sur y
  ///\param z position du point regardé sur z
  inline void setfocuspos(float x, float y, float z){
    focus[0] = x;
    focus[1] = y;
    focus[2] = z;
  }
  
  ///\brief
  ///change la direction du haut de la scène
  ///\param x direction du vecteur sur x
  ///\param y direction du vecteur sur y
  ///\param z direction du vecteur sur z
  inline void sethdirpos(float x, float y, float z){
    hdir[0] = x;
    hdir[1] = y;
    hdir[2] = z;
  }

  ///\brief
  ///valide la position de la camera par l'appel au gluLookAt
  inline void place(){
    gluLookAt(eye[0]  , eye[1]  , eye[2],
	      focus[0], focus[1], focus[2],
	      hdir[0] , hdir[1] , hdir[2]);
  }
};

#endif
